#ifndef __LINKTREE_H_
#define __LINKTREE_H_

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define ElementType void*

struct LinkTreeNode
{
    ElementType data; // 数据区
    struct LinkTreeNode *parent; // 双亲结点
    struct LinkTreeNode *firstChild; // 第一个孩子的指针
    struct LinkTreeNode *nextSbling; // 下一个兄弟节点
};
typedef struct LinkTreeNode LTNode;

struct LinkTree
{
    LTNode *root; // 根结点
};
typedef struct LinkTree LTree;

LTNode* CreateTreeNode(ElementType element); 
bool ConnectBranch(LTNode *parent, LTNode *child);
void InitTree(LTree *tree);
void TravelNode(LTNode *node, int deepth, void (*funcPtr)(ElementType));
void TravelTree(LTree *tree, void (*funcPtr)(ElementType));
bool DisconnectBranch(LTNode *parent, LTNode *child);
void FreeTree(LTree *tree, void (*funcPtr)(ElementType));
int GetTreeHeight(LTree *tree);
// 根据条件查找某一节点
LTNode* FindTreeNode(LTree *tree, ElementType element, bool (*funcPtr)(ElementType, ElementType));

#endif